package persistencia;

import clases.Usuario;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class PUsuario {

    /**
     * Introduce un nuevo usuario en la base de datos
     */
    public static boolean nuevoBD(Usuario usuario) {
        boolean resultado = true; //En principio suponemos que todo va a ir bien
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;

        try {
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            statement = connection.createStatement();

            String sql = "INSERT INTO usuario (nombre, apellido, password, mail)"
                    + " VALUES ("
                    + "'" + usuario.getNombre() + "', "
                    + "'" + usuario.getApellido() + "', "
                    + "'" + usuario.getPassword() + "', "
                    + "'" + usuario.getMail() + "'"
                    + ")";

            //Pasamos el INSERT a la base de datos
            statement.executeUpdate(sql);

            //Asignamos el ID con el que se guardó en la base de datos
            resultSet = statement.executeQuery("SELECT id FROM usuario ORDER BY ID DESC");
            if (resultSet.next()) {
                usuario.setId(resultSet.getInt("id"));
            }

            //Ahora creamos los registros de los 11 jugadores con la palabra 'ninguno'
            for (int i = 1; i < 12; i++) {
                //Sentencia SQL de cada jugador
                sql = "INSERT INTO jugador (id_usuario, dorsal, nombre, pais)"
                        + " VALUES ("
                        + usuario.getId() + ", "
                        + i + ", "
                        + "'Ninguno',"
                        + "''"
                        + ")";
                //Ejecutamos la sentencia
                statement.executeUpdate(sql);
                //Y lo ponemos también en el usuario
                usuario.setJugadorNum(i, "Ninguno");
                usuario.setPaisNum(i, "");
            }

        } catch (Exception ex) {
            //Si se produjo algún error devolvemos false
            resultado = false;
        } finally {
            try {
                resultSet.close();
                statement.close();
                connection.close();
            } catch (Exception ex) {
            }
        }

        return resultado;
    }

    /**
     * Actualiza los datos de un cliente en la base de datos
     */
    public static boolean actualizarBD(Usuario usuario) {
        boolean resultado = true;
        Connection connection = null;
        Statement statement = null;

        try {
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            statement = connection.createStatement();

            String sql = "UPDATE usuario SET "
                    + "nombre='" + usuario.getNombre() + "', "
                    + "apellido='" + usuario.getApellido() + "', "
                    + "password='" + usuario.getPassword() + "', "
                    + "mail='" + usuario.getMail() + "' "
                    + "WHERE id=" + usuario.getId();

            //Pasamos el UPDATE a la base de datos
            statement.executeUpdate(sql);

            //Ahora actualizamos los registros de los 11 jugadores
            for (int i = 1; i < 12; i++) {
                //Sentencia SQL de cada jugador
                sql = "UPDATE jugador SET "
                        + "nombre='" + usuario.getJugadorNum(i) + "' "
                        + "pais='" + usuario.getPaisNum(i) + "' "
                        + "WHERE id_usuario=" + usuario.getId() + " AND dorsal=" + i;
                //Ejecutamos la sentencia
                statement.executeUpdate(sql);
            }


        } catch (Exception ex) {
            //Si se produjo algún error devolvemos false
            resultado = false;
        } finally {
            try {
                statement.close();
                connection.close();
            } catch (Exception ex) {
            }
        }
        return resultado;
    }

    /**
     * Devuelve una lista de usuarios cuyo nombre o apellido o mail coincida con cierto patron
     * @param nombre o apellido o mail
     * @return List<Usuario>
     */
    public static List<Usuario> seleccionarBusquedaBD(String palabra, int primero, int numero) {
        List<Usuario> listUsuario = new ArrayList();
        String sql = "SELECT id, nombre, apellido, password, mail "
                + "FROM usuario "
                + "WHERE activo=1 AND ( nombre LIKE '%" + palabra + "%' OR apellido LIKE '%" + palabra + "%' OR mail LIKE '%" + palabra + "%' ) "
                + "LIMIT " + numero + " OFFSET " + primero;
        listUsuario = seleccionarBD(sql);
        return listUsuario;
    }

    /**
     * Devuelve el usuario cuyo mail coincide exactamente con el mail indicado
     * @param String mail
     * @return Usuario
     */
    public static Usuario seleccionarPorMailBD(String mail) {
        List<Usuario> listUsuario = new ArrayList();
        String sql = "SELECT id, nombre, apellido, password, mail "
                + "FROM usuario "
                + "WHERE mail='" + mail + "'";
        listUsuario = seleccionarBD(sql);
        if (listUsuario.isEmpty()) {
            return null;
        } else {
            return listUsuario.get(0);
        }
    }

    /**
     * Devuelve el número de usuarios cuyo nombre o apellido o mail coincida con cierto patron
     * @param nombre o apellido o mail
     * @return List<Usuario>
     */
    public static int contarBusquedaBD(String palabra) {
        List<Usuario> listUsuario = new ArrayList();
        String sql = "SELECT id, nombre, apellido, password, mail, activo "
                + "FROM usuario "
                + "WHERE ( nombre LIKE '%" + palabra + "%' OR apellido LIKE '%" + palabra + "%' OR mail LIKE '%" + palabra + "%' ) ";
        listUsuario = seleccionarBD(sql);
        return listUsuario.size();
    }

    /**
     * Devuelve el usuario cuyo id se corresponda con el parametro
     * @param id
     * @return Usuario
     */
    public static Usuario seleccionarPorIdBD(int id) {
        List<Usuario> listUsuario = new ArrayList();
        String sql = "SELECT id, nombre, apellido, password, mail, activo FROM usuario WHERE id=" + id;
        listUsuario = seleccionarBD(sql);
        if (listUsuario.isEmpty()) {
            return null;
        } else {
            return listUsuario.get(0);
        }
    }

    /**
     * Método genérico para obtener un listado de Usuarios proporcionando la cadena SQL
     * @param sql de la selección que queremos hacer
     * @return Una List de Usuarios que cumplen el requisito del SQL
     */
    public static List<Usuario> seleccionarBD(String sql) {
        //Lista de usuarios que devolveremos
        List<Usuario> listUsuario = new ArrayList();

        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;

        try {
            Usuario usuario = null;

            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            statement = connection.createStatement();
            resultSet = statement.executeQuery(sql);

            while (resultSet.next()) {
                //Un nuevo usuario
                usuario = new Usuario();
                //Le metemos los datos
                usuario.setId(resultSet.getInt("id"));
                usuario.setNombre(resultSet.getString("nombre"));
                usuario.setApellido(resultSet.getString("apellido"));
                usuario.setPassword(resultSet.getString("password"));
                usuario.setMail(resultSet.getString("mail"));

                //Metemos además sus jugadores, para lo cual hay que hacer otra consulta
                for (int i = 1; i < 12; i++) {
                    //Statement statement2 = connection.createStatement();
                    String sql2 = "SELECT nombre, pais FROM jugador WHERE id_usuario=" + usuario.getId() + " AND dorsal=" + i;
                    ResultSet resultSet2 = statement.executeQuery(sql2);
                    if (resultSet2.next()) {
                        usuario.setJugadorNum(i, resultSet2.getString("nombre"));
                        usuario.setPaisNum(i, resultSet2.getString("pais"));
                    }
                }


                //Cliente construido y lo añadimos a la lista
                listUsuario.add(usuario);

            }

        } catch (Exception ex) {
            //Se ha producido un error
            System.out.println(ex.toString());
        } finally {
            try {
                resultSet.close();
                statement.close();
                connection.close();
            } catch (Exception ex) {
                System.out.println(ex.toString());
            }
        }

        //Devolvemos la lista completa
        return listUsuario;
    }
}